#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <queue>
#include <sstream>
using namespace std;
const int N=510;
const int INF=0x3f3f3f3f;
int n,m;
vector<int> edge[N];
int vis[N];
int dp[N];
void bfs(int x)
{
	dp[x]=0;
	vis[x]=1;
	queue<pair<int,int>> q;
	q.push({x,0});
	while(q.size())
	{
		int s=q.size();
		while(s--)
		{
			int t=q.front().first;
			int step=q.front().second;
		
			q.pop();
			for(auto& e: edge[t])
			{
				if(vis[e])
					continue;
				dp[e]=step+1;
				vis[e]=1;
				q.push({e,dp[e]});
			}			
		}
	}
}
int main()
{
	cin>>m>>n;
	string line;
	getline(cin,line);
	for(int i=1;i<=m;i++)
	{
		
		getline(cin,line);

		stringstream ssin(line);
		int t;
		vector<int> tmp;
		while(ssin>>t)
		{
		  //  cout<<t<<endl;
// 			edge[i].push_back(t);
			tmp.push_back(t);
		}
		for(int j=0;j<tmp.size();j++)
		{
			for(int z=j+1;z<tmp.size();z++)
			{
				// cout<<tmp[j]<<' '<<tmp[z]<<endl;
				edge[tmp[j]].push_back(tmp[z]);
			}
		}
// 		cout<<"-------"<<endl;
	}
	
// 	for(int i=1;i<=n;i++)
// 	{
// 		for(int j=0;j<edge[i].size();j++)
// 		{
// 			cout<<i<<":"<<edge[i][j]<<' ';
// 		}
// 		cout<<endl;
// 	}
	memset(dp,INF,sizeof(dp));
	
	bfs(1);
	if(dp[n]==INF)
	{
		cout<<"NO"<<endl;
	}
	else{
		cout<<dp[n]-1<<endl;
	}
	return 0;
}
